/*
 * 
 *  Este arquivo é parte do software TODO Calculadora. TODO Calculadora é um software livre;
 *  você pode redistribui-lo e/ou modifica-lo dentro dos termos da Licença Pública Geral GNU
 *  como publicada pela Fundação do Software Livre (FSF); na versão 2 da Licença,
 *  ou (na sua opnião) qualquer versão.
 *  
 *	Este programa é distribuido na esperança que possa ser útil, mas SEM NENHUMA GARANTIA;
 *  sem uma garantia implícita de ADEQUAÇÂO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR.
 *  Veja a Licença Pública Geral GNU para maiores detalhes. Você deve ter recebido uma cópia
 *  da Licença Pública Geral GNU junto com este programa, se não, escreva para a Fundação do
 *	Software Livre(FSF)
 *
 *	Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
package principal;

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.text.JTextComponent;

/**
 * <p>
 * Classe utilitária que realiza aos tratamentos básicos na tela de interface
 * gráfica.
 * </p>
 *
 * Criação: 29/04/2013
 *
 * @author Willyan Guimarães Caetano
 */
public final class CalculadorGUIUtil {

    /**
     * Constante que representa número "1" (um)
     */
    public static final String UM = "1";
    /**
     * Constante que representa número "2" (dois)
     */
    public static final String DOIS = "2";
    /**
     * Constante que representa número "3" (três)
     */
    public static final String TRES = "3";
    /**
     * Constante que representa número "4" (quatro)
     */
    public static final String QUATRO = "4";
    /**
     * Constante que representa número "5" (cinco)
     */
    public static final String CINCO = "5";
    /**
     * Constante que representa número "6" (seis)
     */
    public static final String SEIS = "6";
    /**
     * Constante que representa número "7" (sete)
     */
    public static final String SETE = "7";
    /**
     * Constante que representa número "8" (oito)
     */
    public static final String OITO = "8";
    /**
     * Constante que representa número "9" (nove)
     */
    public static final String NOVE = "9";
    /**
     * Constante que representa número "0" (zero)
     */
    public static final String ZERO = "0";

    /**
     * Constante que representa o caractere de vírgula (",")
     */
    public static final String VIRGULA = ",";

    /**
     * Constante que o tamanho máximo do campo numérico da calculadora, que é
     * "12" (doze)
     */
    public static final int tamanhoMaximoCampo = 12;

    private CalculadorGUIUtil() {
    }

    /**
     * <p>
     * Verifica se já existe algum dado digitado na calculadora. Deve ser
     * executado sempre que um novo dígito é reconhecido visto que o número
     * poderá estar sendo composto para o processo de operação e então deve ser
     * usado no processo de concatenação.
     * </p>
     *
     * @param campo Campo de texto
     */
    public static boolean verificaExistenciaDadosCampo(JTextComponent campo) {
        return campo.getText().length() != 0;
    }

    /**
     *
     * @param campo Valor capturado no campo da calculadora
     * @return Valor do campo
     */
    public static String capturaValorDoCampo(JTextComponent campo) {
        String valor = campo.getText();

        return valor;
    }

    /**
     * <p>
     * Faz o trabalho de concatenação dos números para composição do valor
     * digitado na calculadora.
     * </p>
     *
     * @param caracter Caracter digitado
     * @param campo Display da calculadora
     * @return Valor atualizado
     */
    public static String posicionaCaracteresCampo(String caracter,
            JTextComponent campo) {
        String valorAtualNoCampo = capturaValorDoCampo(campo);

        String valorAtualizado = valorAtualNoCampo + caracter;

        return valorAtualizado;
    }

    /**
     * Processa inserção de valores no campo numérico verificando a existência
     * de algum dado no mesmo e chamando o processo de posicionamento.
     *
     * @param caracter Caracter novo
     * @param campo Campo numérico
     * @return
     */
    public static String processaInsercaoValorCampo(String caracter,
            JTextComponent campo) {        
        if (verificaExistenciaDadosCampo(campo)) {
            String novoValor = posicionaCaracteresCampo(caracter, campo);

            return novoValor;
        } else {
            return caracter;

        }
    }

    /**
     * Executa a limpeza no campo numérico da calculadora e também retorna o
     * foco para a mesma.
     */
    public static void executaLimpezaCampoERetornoDeFoco(JTextComponent campo) {
        campo.setText("");
        campo.grabFocus();
    }

    /**
     * Processa a lógica da tecla de inversão de sinais
     *
     * @param campo Campo de onde é capturada os sinais
     * @return
     */
    public static String processaTeclaInversaoSinais(JTextComponent campo) {
        if (campo.getText().equals("")) {
            return "";
        } else if (campo.getText().startsWith("-")) {
            return campo.getText().replace("-", "");
        } else {
            return "-" + campo.getText();
        }

    }

    /**
     * <p>
     * Verifica tecla que foi pressionada e caso seja um número, retorna para o
     * display
     * </p>
     *
     * @param evt Evento de tecla correspondente a tecla digitada
     * @return Valor a ser exibido no display
     */
    public static String verificaTeclaPressionada(ActionEvent evt) {

        if (evt.getSource().equals(KeyEvent.VK_0)) {
            return ZERO;
        } else if (evt.getSource().equals(KeyEvent.VK_1)) {
            return UM;
        } else if (evt.getSource().equals(KeyEvent.VK_2)) {
            return DOIS;
        } else if (evt.getSource().equals(KeyEvent.VK_3)) {
            return TRES;
        } else if (evt.getSource().equals(KeyEvent.VK_4)) {
            return QUATRO;
        } else if (evt.getSource().equals(KeyEvent.VK_5)) {
            return CINCO;
        } else if (evt.getSource().equals(KeyEvent.VK_6)) {
            return SEIS;
        } else if (evt.getSource().equals(KeyEvent.VK_7)) {
            return SETE;
        } else if (evt.getSource().equals(KeyEvent.VK_8)) {
            return OITO;
        } else if (evt.getSource().equals(KeyEvent.VK_9)) {
            return NOVE;
        } else if (evt.getSource().equals(KeyEvent.VK_COMMA)) {
            return VIRGULA;
        } else {
            return null;
        }
    }

}
